package DataStructure.StackLearning.StackLinked;

/**
 * 实现的是一个数据容器: 站在集合类角度
 * 用链表实现一个栈: 先进后出
 *
 */
public class MyStackLinked <T> {

    private Node top;// 维护的栈顶
    private int size;// 栈中元素个数

    /**
     * 入栈操作
     * @param str : 入栈元素
     * @return : 入栈是否成功
     */
    public boolean push(T str){
        if (str == null) throw new RuntimeException("parame is null");
        top =  new Node(str, top);
        size++;
        return  true;
    }

    /**
     * 栈的出栈操作
     * @return : 要出栈的元素(栈顶)
     */
    public T pop(){
        if (isEmpty()){// 栈为空
            return null;
        }

        T oldValue = top.value;
        top = top.next;
        size--;
        return oldValue;
    }

    /**
     * 查看栈顶元素
     * @return
     */
    public T peek(){
        if (isEmpty()){// 栈为空
            return null;
        }
        return top.value;
    }


    /**
     * 栈的判空
     * @return: 空: 真,  不空: 假
     */
    public boolean isEmpty(){
        return size == 0;
    }


    class Node{
        T value;
        Node next;
        public Node(T value, Node next) {
            this.value = value;
            this.next = next;
        }
    }
}
